Kernel Pwn 学习(一)

Kernel Pwn 学习(一)

kernel pwn 环境搭建

# 编译内核

首先到 linux 内核官网下载一份内核源代码并解压

image-20220209230147843

选择一个版本下载,我选的是 4.9 [tallball],

之后安装需要的依赖

1
2
sudo apt-get update
sudo apt-get install git fakeroot build-essential ncurses-dev xz-utils libssl-dev bc

解压源码后进入内核目录,输入命令 sudo make menuconfig 进入内核设置

img

进入 kernel hacking,检查保证勾选了以下选项 (其实默认都是勾选的,只是进去看一眼而已)

  • Kernel debugging
  • Compile-time checks and compiler options —> Compile the kernel with debug info 和 Compile the kernel with frame pointers
  • KGDB: kernel debugger

保存并退出

sudo make bzImage 生成 bzImage,过程挺久的,完成后在 boot 下生成了一个 bzImage 文件

注:

在过程中可能报错 没有规则可制作目标debian/certs/debian-uefi-certs.pem由certs/x509_certificate_list需求停止

解决方法:在主目录 /usr/src/linux… 中修改.config 文件,去掉上述内容(如果还是不行就修改 linux.4.9 中的.config 对应部分为空image-20220209230842570

重新编译即可

# 编译 busybox 构建文件系统

busybox 官网下载 busybox 文件,最新版的就行

解压后进入目录, make menuconfig ,同样会进入图形界面,在 Settings 上勾选 Build static binary (no shared libs), 然后保存退出

编译,执行 make install ,根目录下会生成一个 _install 文件夹,进入文件夹配置

1
2
3
4
5
6
cd _install
mkdir proc
mkdir sys
touch init
touch packet
chmod +x init

编辑 init 文件,用于内核初始化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/bin/sh
echo "{==DBG==} INIT SCRIPT"
mkdir /tmp
mount -t proc none /proc
mount -t sysfs none /sys
mount -t debugfs none /sys/kernel/debug
mount -t tmpfs none /tmp
#mount指令 挂载某个分区到某个文件,这样就将分区与文件建立联系从而访问文件时就可以访问分区。
# insmod /xxx.ko # 加载模块
# insmod /hello.ko # 加载hello.ko模块
mdev -s
# We need this to find /dev/sda later
echo -e "{==DBG==} Boot took $(cut -d' ' -f1 /proc/uptime) seconds"
setsid /bin/cttyhack setuidgid 1000 /bin/sh #normal user
# exec /bin/sh #root

几个常见指令

  • insmod: 指定模块加载到内核中
  • rmmod: 从内核中卸载指定模块
  • lsmod: 列出已经加载的模块

在 packet 中写入,用于将 FileSystem 打包成映像

1
2
3
#!/bin/sh
echo "Generate rootfs.img"
find . | cpio -o --format=newc > ./rootfs.img

运行 packet 将得到 rootfs.img 文件

image-20220209231518652

# 运行内核

安装 qemu

1
2
3
4
安装QEMU的依赖库
sudo apt-get install git libglib2.0-dev libfdt-dev libpixman-1-dev zlib1g-dev
sudo apt-get install qemu
测试输入qemu + tab 如果有很多实例回显,就说明安装成功

image-20220209231643002

之后写一个 shell 脚本启动 qemu, 将前面生成的 bzImage,rootfs.img 一起放到_install 文件夹下,运行 boot.sh,结果如下

image-20220209231910444

如果显示权限不够则 chmod +x boot.sh 并在 root 下运行即可

shell 中参数的含义:

1
2
3
4
5
6
7
8
9
-m 是指定RMA大小(默认384)
-kernel 是指定的内核镜像,这里是我们编译的镜像路径,也可以是我们下载好的镜像,如./vmlinuz-4.10.0-1004-gcp
-initrd 设置刚刚利用 busybox 创建的 rootfs.img,作为内核启动的文件系统
-append 附加选项,指定no kaslr 可以关闭随机偏移
--nographic和console=ttyS0一起使用,启动的界面就变成了当前终端
-s 相当于-gdb tcp::1234的简写,可以直接通过主机的gdb远程连接
-monitor 配置用户械的网络 // 将监视器重定向主机设备 /dev/null
-smp 用于生明所以可能用的cps,ie,socket cores threads = maxcputs.
-cpu 设置cpu的安全选项

到这里也说明了为什么 kernel pwn 题目一般都会给出这 3 个文件 .sh ,bzImage,rootfs.cpio ,分别是启动脚本,kernel 镜像以及文件系统映像

一般来说 kernel pwn 里面,漏洞通常是出现在 ko 文件,也就是模块文件,驱动 文件中,而 kernel pwn 的最终目标一般是提权,拿到 root 才能读取 flag

# 参考文章

https://blog.csdn.net/qq_40827990/article/details/97036109

https://n0va-scy.github.io/2020/06/21/kernel pwn 环境搭建 /

Author

y1seco

Posted on

2022-02-09

Updated on

2022-02-10

Licensed under

Comments

:D 一言句子获取中...